home *** CD-ROM | disk | FTP | other *** search
- {
- VINCE LAURENT
-
- I wrote some code to draw a scalable hex field on the screen. Can
- anyone give me a hand in optimizing it? There is a lot of redundant
- line drawing and positioning... I would also like to be able to have
- a fexible amount of hexigons showing. For example, if the scale is,
- say 40, show 19 hexs, if it is smaller, show more (like as many that
- could have fit in the area occupied by 19).
-
- BTW, this code can be freely used and distributed or completely ignored :-) }
-
- Program HexzOnScreen;
- Uses
- Graph, Crt;
- Type
- PtArray = Array [1..6, 1..2] of Real;
- Var
- s1, s2,
- side,
- i, j,
- Gd, Gm : Integer;
- Pts : PtArray;
- ErrCode : Integer;
- Sqrt3,
- sts : Real;
-
- begin
- Sqrt3 := Sqrt(3);
- Side := 40; { initial hex side length ( min = 8 ) }
- sts := Side * Sqrt3;
- s1 := 200;
- s2 := 60; { starting point For hex field }
- InitGraph(Gd, Gm, 'e:\bp\bgi\');
- ErrCode := GraphResult;
- if not ErrCode = grOk then
- begin
- Writeln('Error: ', GraphErrorMsg(ErrCode));
- Halt(0);
- end;
- SetColor(LightGray);
- Delay(10); { give the screen a chance to toggle to Graph mode }
- For j := 1 to 17 DO
- begin
- Pts[1, 1] := s1;
- Pts[1, 2] := s2;
- Pts[2, 1] := Pts[1, 1] - side;
- Pts[2, 2] := Pts[1, 2];
- Pts[3, 1] := Pts[1, 1] - side - (side / 2);
- Pts[3, 2] := Pts[1, 2] + (sts / 2);
- Pts[4, 1] := Pts[1, 1] - side;
- Pts[4, 2] := Pts[1, 2] + sts ;
- Pts[5, 1] := Pts[1, 1];
- Pts[5, 2] := Pts[4, 2];
- Pts[6, 1] := Pts[1, 1] + (side / 2);
- Pts[6, 2] := Pts[1, 2] + (sts / 2);
- For I := 1 to 6 DO
- begin
- if i <> 6 then
- Line(Round(Pts[i, 1]), Round(Pts[i, 2]),
- Round(Pts[i + 1, 1]), Round(Pts[i + 1, 2]))
- else
- Line(Round(Pts[i, 1]), Round(Pts[i, 2]),
- Round(Pts[1, 1]), Round(Pts[1, 2]));
- end;
- Case j OF
- 1..2 :
- begin
- s1 := Round(Pts[6, 1] + side);
- s2 := Round(Pts[6, 2]);
- end;
- 3..4 :
- begin
- s1 := Round(Pts[5, 1]);
- s2 := Round(Pts[5, 2]);
- end;
- 5..6 :
- begin
- s1 := Round(Pts[3, 1]);
- s2 := Round(Pts[3, 2]);
- end;
- 7..8 :
- begin
- s1 := Round(Pts[3, 1]);
- s2 := Round(Pts[3, 2] - sts);
- end;
- 9..10 :
- begin
- s1 := Round(Pts[1, 1]);
- s2 := Round(Pts[1, 2] - sts);
- end;
- 11 :
- begin
- s1 := Round(Pts[6, 1] + side);
- s2 := Round(Pts[6, 2] - sts);
- end;
- 12..13 :
- begin
- s1 := Round(Pts[6, 1] + side);
- s2 := Round(Pts[6, 2]);
- end;
- 14 :
- begin
- s1 := Round(Pts[5, 1]);
- s2 := Round(Pts[5, 2]);
- end;
- 15 :
- begin
- s1 := Round(Pts[3, 1]);
- s2 := Round(Pts[3, 2]);
- end;
- 16 :
- begin
- s1 := Round(Pts[3, 1]);
- s2 := Round(Pts[3, 2] - sts);
- end;
- end;
- end;
- Line(s1, s2, Round(s1 + (side / 2)), Round(s2 - sts / 2));
- Readln;
- CloseGraph;
- end.